package org.xinghai.sql.main.utils;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.time.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

public class TypeMapperUtils {
    static final Map<String, Class<?>> TYPE_MAPPINGS = new HashMap<>();

    static {
        // 数字类型
        TYPE_MAPPINGS.put("INT", Integer.class);
        TYPE_MAPPINGS.put("INTEGER", Integer.class);
        TYPE_MAPPINGS.put("TINYINT", Byte.class);
        TYPE_MAPPINGS.put("SMALLINT", Short.class);
        TYPE_MAPPINGS.put("BIGINT", Long.class);
        TYPE_MAPPINGS.put("DECIMAL", BigDecimal.class);
        TYPE_MAPPINGS.put("NUMERIC", BigDecimal.class);
        TYPE_MAPPINGS.put("FLOAT", Float.class);
        TYPE_MAPPINGS.put("DOUBLE", Double.class);
        TYPE_MAPPINGS.put("REAL", Double.class);

        // 字符串类型
        TYPE_MAPPINGS.put("VARCHAR", String.class);
        TYPE_MAPPINGS.put("CHAR", String.class);
        TYPE_MAPPINGS.put("TEXT", String.class);
        TYPE_MAPPINGS.put("CLOB", String.class);

        // 日期时间类型
        TYPE_MAPPINGS.put("DATE", LocalDate.class);
        TYPE_MAPPINGS.put("TIME", LocalTime.class);
        TYPE_MAPPINGS.put("DATETIME", LocalDateTime.class);
        TYPE_MAPPINGS.put("TIMESTAMP", Instant.class);
        TYPE_MAPPINGS.put("YEAR", Year.class);

        // 布尔类型
        TYPE_MAPPINGS.put("BIT", Boolean.class);
        TYPE_MAPPINGS.put("BOOLEAN", Boolean.class);

        // 二进制类型
        TYPE_MAPPINGS.put("BLOB", byte[].class);
        TYPE_MAPPINGS.put("BINARY", byte[].class);

        // 数字类型补充
        TYPE_MAPPINGS.put("INT UNSIGNED", Long.class); // 无符号int通常范围超过Integer，映射为Long
        TYPE_MAPPINGS.put("SMALLINT UNSIGNED", Integer.class); // 无符号smallint映射为Integer
        TYPE_MAPPINGS.put("BIGINT UNSIGNED", BigInteger.class); // 无符号bigint映射为BigInteger
        TYPE_MAPPINGS.put("DOUBLE PRECISION", Double.class); // 高精度double

// 字符串类型补充（含数据库特有类型）
        TYPE_MAPPINGS.put("NVARCHAR", String.class); // 支持Unicode的可变长度字符串
        TYPE_MAPPINGS.put("NCHAR", String.class); // 支持Unicode的固定长度字符串
        TYPE_MAPPINGS.put("TINYTEXT", String.class); // 短文本
        TYPE_MAPPINGS.put("MEDIUMTEXT", String.class); // 中等长度文本
        TYPE_MAPPINGS.put("LONGTEXT", String.class); // 长文本
        TYPE_MAPPINGS.put("ENUM", String.class); // 枚举类型，通常映射为字符串

// 日期时间类型补充（含时区相关）
        TYPE_MAPPINGS.put("TIMESTAMP WITH TIME ZONE", OffsetDateTime.class); // 带时区的时间戳
        TYPE_MAPPINGS.put("TIMESTAMPTZ", OffsetDateTime.class); // PostgreSQL特有的带时区时间戳
        TYPE_MAPPINGS.put("DATETIMEOFFSET", OffsetDateTime.class); // SQL Server带时区 datetime
        TYPE_MAPPINGS.put("INTERVAL", Period.class); // 时间间隔（日期部分）
        TYPE_MAPPINGS.put("TIME WITH TIME ZONE", OffsetTime.class); // 带时区的时间

// 二进制类型补充
        TYPE_MAPPINGS.put("VARBINARY", byte[].class); // 可变长度二进制
        TYPE_MAPPINGS.put("TINYBLOB", byte[].class); // 小型二进制对象
        TYPE_MAPPINGS.put("MEDIUMBLOB", byte[].class); // 中型二进制对象
        TYPE_MAPPINGS.put("LONGBLOB", byte[].class); // 大型二进制对象

// 特殊类型
        TYPE_MAPPINGS.put("JSON", String.class); // JSON类型，通常映射为字符串
        TYPE_MAPPINGS.put("JSONB", String.class); // PostgreSQL二进制JSON
        TYPE_MAPPINGS.put("UUID", UUID.class); // UUID类型
        TYPE_MAPPINGS.put("GEOMETRY", Object.class); // 空间几何类型（通用映射，可根据实际库细化）
        TYPE_MAPPINGS.put("ARRAY", List.class); // 数组类型，通常映射为List
    }

    /**
     * 将 SQL 类型转换为 Java 类型
     * @param sqlType SQL 数据类型（不区分大小写）
     * @return 对应的 Java 类型
     * @throws IllegalArgumentException 当遇到不支持的 SQL 类型时抛出
     */
    public static Class<?> sqlTypeToJavaType(String sqlType) {
        Class<?> javaType = TYPE_MAPPINGS.get(sqlType.toUpperCase());
        if (javaType == null) {
            throw new IllegalArgumentException("不支持的 SQL 类型: " + sqlType);
        }
        return javaType;
    }

    // 防止实例化
    private TypeMapperUtils() {}
}